#include "dma.h"
#include "led.h"
#include "zf_uart.h"
#include <stdio.h>
#include <stdarg.h>
#include <string.h>

uint8 xdata DMAUart1TXBuff[256] = {0};
bit DMAUart1TxBusy = DISABLE;
uint8 tail[4] = {0x00, 0x00, 0x80, 0x7f};

void DMA_printf(const char *format, ...)
{
	uint16 length = 0;
	va_list args;

	// 等待串口发送完成，注意是串口发送完成，不是DMA传输完成
	while (DMAUart1TxBusy)
		LED_SetColor(CYAN);
	// 如果没有上面这条语句，连续调用printf_DMA时可能输出错误。

	va_start(args, format);
	length = vsprintf(DMAUart1TXBuff, format, args) - 1;
	va_end(args);

	DMA_UR1T_AMT = length;		 // 设置传输总字节数(低8位)：n+1
	DMA_UR1T_AMTH = length >> 8; // 设置传输总字节数(高8位)：n+1
	DMAUart1TxBusy = ENABLE;
	DMA_UR1T_CR = 0xc0; // bit7 1:使能 UART1_DMA, bit6 1:开始 UART1_DMA 自动发送
}

void DMA_JustFloat(fp32 _NumArgs[], uint8 _len)
{
	fp32 num;
	uint8 i, j, temp[4];
	uint8 *p = DMAUart1TXBuff;

	while (DMAUart1TxBusy)
		LED_SetColor(CYAN);

	for (j = 0; j < _len; j++)
	{
		num=_NumArgs[j];
		memcpy(temp, &num, 4);
		for (i = 0; i < 4; i++)
		{
			*p = temp[3 - i];
			p++;
		}
	}
	memcpy(p, tail, 4);

	DMA_UR1T_AMT = _len*4+4-1;	   // 设置传输总字节数(低8位)：n+1
	DMA_UR1T_AMTH = _len*4+4-1 >> 8; // 设置传输总字节数(高8位)：n+1
	DMAUart1TxBusy = ENABLE;
	DMA_UR1T_CR = 0xc0; // bit7 1:使能 UART1_DMA, bit6 1:开始 UART1_DMA 自动发送
}

void DMA_Uart_Init(void)
{
	DMA_UR1T_CFG = 0x80;							 // bit7 1:使能串口1DMA发送中断
	DMA_UR1T_STA = 0x00;							 // 清零串口1DMA发送完成中断标志、清零数据覆盖中断标志
	DMA_UR1T_AMT = 0;								 // 设置传输总字节数(低8位)：n+1
	DMA_UR1T_AMTH = 0;								 // 设置传输总字节数(高8位)：n+1
	DMA_UR1T_TXAH = (u8)((u16)&DMAUart1TXBuff >> 8); // 设置传输数据的源地址，高8位
	DMA_UR1T_TXAL = (u8)((u16)&DMAUart1TXBuff);		 // 设置传输数据的源地址，低8位

	// DMA_UR1R_CFG = 0x80;				// bit7 1:使能串口1DMA接收中断
	// DMA_UR1R_STA = 0x00;				// 清零串口1DMA接收完成中断标志、清零数据丢弃中断标志
	// DMA_UR1R_AMT =  256;								// 设置传输总字节数(低8位)：n+1
	// DMA_UR1R_AMTH = 256 >> 8;						// 设置传输总字节数(高8位)：n+1
	// DMA_UR1R_RXAH = (u8)((u16)&DMABuffer >> 8);	// 设置传输数据的目标地址，高8位
	// DMA_UR1R_RXAL = (u8)((u16)&DMABuffer);			// 设置传输数据的目标地址，低8位
	// DMA_UR1R_CR = 0xa1;					//bit7 1:使能串口1DMA接收, bit5 1:开始DMA自动接收, bit0 1:清除 FIFO
}
